#version 300 es

//https://blog.csdn.net/qjh5606/article/details/82592207
precision mediump float;
//2d纹理id
layout (location = 10) uniform sampler2D SamplerY;
layout (location = 11) uniform sampler2D SamplerU;
layout (location = 12) uniform sampler2D SamplerV;
//当前片段对应的纹理坐标
in vec2 V_Texcoord;
//输出片段颜色
out vec4 fragColor;

//用来做YUV --> RGB 的变换矩阵
const vec3 delyuv = vec3(-0.0/255.0, -128.0/255.0, -128.0/255.0);
const mat3 matYUVRGB33 = mat3(
1.0, 0.0, 1.4075,
1.0, -0.3455, -0.7169,
1.0, 1.7790, 0.0
);
void main() {
    //这个是仿造801中的yuv转rgb的算法。百度时发现有很多人计算常量参数不太一样。
    //    float y, u, v, r, g, b;
    //    y = texture(SamplerY, V_Texcoord).r;
    //    u = texture(SamplerU, V_Texcoord).r;
    //    v = texture(SamplerV, V_Texcoord).r;
    //    u = u - 0.5;
    //    v = v - 0.5;
    //    r = y + 1.4075*v;
    //    g = y - 0.3455*u - 0.7169*v;
    //    b = y + 1.7790*u;
    //    fragColor = vec4(r, g, b, 1.0);
    //    //    fragColor = vec4(y, y, y, 1.0);
    //    //    fragColor = vec4(u, u, u, 1.0);
    //    //    fragColor = vec4(v, v, v, 1.0);

    //矩阵运算来实现yuv转rgb，实际转化的计算量并不高，恐怕没上面直接计算来的快吧。。。。
    //从纹理根据坐标读取yuv
    vec3 yuv = vec3(
    texture(SamplerY, V_Texcoord).r,
    texture(SamplerU, V_Texcoord).r,
    texture(SamplerV, V_Texcoord).r
    );

    //特效1：灰阶，将图象转黑白，即uv分量取中间值，实现图象去色
//    yuv.y = 0.5;
//    yuv.z = 0.5;

    //图象复古效果，在灰阶的基础上，偏移uv分量
    // sepia / sepiagreen / sepiablue
    //特效2：复古蓝
    //    yuv.y = 0.5 + 88.0 / 255.0;
    //    yuv.z = 0.5 - 30.0 / 255.0;
    //特效3：复古绿
    //    yuv.y = 0.5 - 88.0 / 255.0;
    //    yuv.z = 0.5 + 30.0 / 255.0;

    //使用向量相加，对yuv值进行偏移，作用是让uv都减去0.5
    yuv += delyuv;
    //将向量应用于矩阵变化,让其每个维度都做对应的计算，变换成rgb
    vec3 rgb =yuv*matYUVRGB33;

    //特效4：负片，反转rgb各通道数值
    //    rgb =vec3(1.0, 1.0, 1.0)-rgb;

    //vec4表示四维向量，读取值可用xyzw或rgba来读取，也可以用agb[0] agb[1] agb[2]来读取
    fragColor = vec4(rgb.r, rgb.g, rgb.b, 1.0);
}